package org.example.Util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.SignatureAlgorithm;
import org.example.service.model.UserModel;
import io.jsonwebtoken.Jwts;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xietl
 * @date 2025/10/8  15:03
 * @description JWT工具类  * 用于生成和解析JWT Token
 */
public class JwtUtil {
    private static final String SECRET_KEY="kuuga2025";
    //过期时间24小时
    private static final long EXPIRATION_TIME=86400000;

    /**
     * 生成JWT Token
     * @param userModel
     * @return
     */
    public static String generateToken(UserModel userModel){
        Map<String,Object> claims=new HashMap<>();
        claims.put("id",userModel.getId());
        claims.put("name",userModel.getName());
        claims.put("teiphon",userModel.getTeiphon());
        claims.put("gender", userModel.getGender());
        claims.put("age", userModel.getAge());
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(userModel.getName())
                .setIssuedAt(new Date(System.currentTimeMillis())) //设置签发时间为当前时间
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_TIME)) //设置过期时间为当前时间+24小时
                .signWith(SignatureAlgorithm.HS512,SECRET_KEY)//使用HS512算法签名,密钥为SECRET_KEY
                .compact(); //将JWT Token转换为字符串
    }

    /**
     * 解析JWT Token
     * @param token jwt token
     * @return Claims对象
     */
    public static Claims parseToken(String token){
        try{
            return Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e){
            return null;
        }
    }

    /**
     * 从JWT Token中提取用户信息
     * @param token
     * @return
     */
    public static UserModel getUserFromToken(String token){
        Claims claims=parseToken(token);
        if (claims == null) {
            return null;
        }
        UserModel userModel=new UserModel();
        userModel.setId((Integer) claims.get("id"));
        userModel.setName((String) claims.get("name"));
        userModel.setTeiphon((String) claims.get("teiphon"));
        Integer genderInt = claims.get("gender", Integer.class);
        if (genderInt != null) {
            userModel.setGender(genderInt.byteValue()); // 安全转换（tinyint 范围在 Byte 内）
        }
        userModel.setAge((Integer) claims.get("age"));
        return userModel;
    }

    /**
     * 验证JWT Token是否过期
     * @param token
     * @return
     */
    public static boolean validateToken(String token){
        Claims claims=parseToken(token);
        if(claims==null){
            return false;
        }
        //检查过期时间是否在当前时间之前
        return !claims.getExpiration().before(new Date());
    }
}
